package com.dp.client.views.clientes;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.bytecode.javassist.BulkAccessor;

import com.dp.client.dto.AlmacenDTO;
import com.dp.client.dto.ClienteBusqueda;
import com.dp.client.dto.ClienteDTO;
import com.dp.client.servicios.almacenes.IServiciosAlmacen;
import com.dp.client.servicios.almacenes.IServiciosAlmacenAsync;
import com.dp.client.servicios.clientes.IServiciosCliente;
import com.dp.client.servicios.clientes.IServiciosClienteAsync;
import com.dp.client.util.Alerts;
import com.dp.client.views.paquete.DatosEnvioPaquete;
import com.dp.client.views.paquete.PaquetePrincipal;
import com.dp.client.views.paquete.RegistraPaqueteNuevo;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.event.logical.shared.CloseEvent;
import com.google.gwt.event.logical.shared.CloseHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.PopupPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.datepicker.client.DateBox;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.cellview.client.DataGrid;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.RadioButton;

public class ClientePrincipal extends Composite implements WizardStage{
	private FlexTable clientesTable;
	private TextBox txtBuscarNombre;
	private TextBox txtBuscarApp1;
	private TextBox txtBuscarApp2;
	private TextBox txtBuscarCodigo;

	//radiobutton
	private DatosEnvioPaquete datosPaquete;
	private RadioButton rdbSeleccion;
	private ClienteDTO clienteSeleccionado;
	private boolean seleccion;
	private PaquetePrincipal padrePaquete;
	static private AlmacenDTO almacen;
	private boolean emisor=false;
	
	/**
	 * @wbp.parser.constructor
	 */
	public ClientePrincipal( boolean seleccion , PaquetePrincipal padre , DatosEnvioPaquete datos){
		emisor=true;
		this.padrePaquete = padre;
		this.datosPaquete = datos;
		buildComponents(seleccion);
	}
	public ClientePrincipal (boolean seleccion , DatosEnvioPaquete datos){
		emisor=false;
		this.datosPaquete = datos;
		buildComponents(seleccion);
	}
	
	public ClientePrincipal( boolean seleccion , PaquetePrincipal padre ){
		this.padrePaquete = padre;
		buildComponents(seleccion);
	}
	public ClientePrincipal(boolean seleccion) {
		buildComponents(seleccion);
	}

	void buildComponents( boolean seleccion ){

		this.seleccion=seleccion;
		
		CaptionPanel upperPanel = new CaptionPanel();
		upperPanel.setCaptionText("Clientes");
		
		initWidget(upperPanel);
		upperPanel.setSize("auto", "auto");
		VerticalPanel verticalPanel = new VerticalPanel();
		upperPanel.add(verticalPanel);
        
		HorizontalPanel horizontalPanel = new HorizontalPanel();
		verticalPanel.add(horizontalPanel);
		
		FlexTable flexTable = new FlexTable();
		horizontalPanel.add(flexTable);
		
		Label lblNombres = new Label("Nombre:");
		flexTable.setWidget(0, 0, lblNombres);
		
		txtBuscarNombre = new TextBox();
		flexTable.setWidget(0, 1, txtBuscarNombre);
		
		Label lblApellido = new Label("Apellido 1:");
		flexTable.setWidget(1, 0, lblApellido);
		
		txtBuscarApp1 = new TextBox();
		flexTable.setWidget(1, 1, txtBuscarApp1);
		
		Label lblApellido_1 = new Label("Apellido 2:");
		flexTable.setWidget(2, 0, lblApellido_1);
		
		txtBuscarApp2 = new TextBox();
		flexTable.setWidget(2, 1, txtBuscarApp2);
		
		Label lblCodigo = new Label("Codigo");
		flexTable.setWidget(3, 0, lblCodigo);
		
		HorizontalPanel horizontalPanel_1 = new HorizontalPanel();
		flexTable.setWidget(3, 1, horizontalPanel_1);
		
		txtBuscarCodigo = new TextBox();
		horizontalPanel_1.add(txtBuscarCodigo);
		txtBuscarCodigo.setWidth("96px");
		
		Button btnBuscar = new Button("Buscar");
		btnBuscar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				buscarClientes();
			}
		});
		horizontalPanel_1.add(btnBuscar);
		
		CaptionPanel cptnpnlRegistro = new CaptionPanel("Registro");
		horizontalPanel.add(cptnpnlRegistro);
		
		FlexTable flexTable_1 = new FlexTable();
		cptnpnlRegistro.setContentWidget(flexTable_1);
		flexTable_1.setSize("auto", "auto");
		
		Label lblInicio = new Label("Inicio:");
		flexTable_1.setWidget(0, 0, lblInicio);
		
		DateBox dateBox = new DateBox();
		flexTable_1.setWidget(0, 1, dateBox);
		
		Label lblFin = new Label("Fin:");
		flexTable_1.setWidget(1, 0, lblFin);
		
		DateBox dateBox_1 = new DateBox();
		flexTable_1.setWidget(1, 1, dateBox_1);
		
		CaptionPanel cptnpnlNewPanel = new CaptionPanel("");
		verticalPanel.add(cptnpnlNewPanel);
		
		VerticalPanel verticalPanel_1 = new VerticalPanel();
		cptnpnlNewPanel.setContentWidget(verticalPanel_1);
		verticalPanel_1.setSize("100%", "3cm");
		
		HorizontalPanel horizontalPanel_2 = new HorizontalPanel();
		verticalPanel_1.add(horizontalPanel_2);
		
		Button btnCrearNuevo = new Button("Crear nuevo");
		horizontalPanel_2.add(btnCrearNuevo);
		
		Button btnRefrescar = new Button("Refrescar");
		btnRefrescar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				refrescarTabla();
			}
		});
		horizontalPanel_2.add(btnRefrescar);
		btnCrearNuevo.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				ClienteDialog clienteDialog = new ClienteDialog(null);
				
				clienteDialog.center();
				clienteDialog.addCloseHandler(new CloseHandler<PopupPanel>() {
					@Override
					public void onClose(CloseEvent<PopupPanel> event) {
						refrescarTabla();
					}
				});
			}
		});
		
		clientesTable = new FlexTable();
		verticalPanel_1.add(clientesTable);
		clientesTable.setWidth("100%");
		
		Label lblCodigo_1 = new Label("Codigo");
		clientesTable.setWidget(0, 0, lblCodigo_1);
		
		Label lblNombre = new Label("Nombre");
		clientesTable.setWidget(0, 1, lblNombre);
		
		Label lblApellido_2 = new Label("Apellido 1");
		clientesTable.setWidget(0, 2, lblApellido_2);
		lblApellido_2.setWidth("100%");
		
		Label lblApellido_3 = new Label("Apellido 2");
		clientesTable.setWidget(0, 3, lblApellido_3);
		
		Label lblCorreo = new Label("Correo");
		clientesTable.setWidget(0, 4, lblCorreo);
		
		Label lblEnvio = new Label("Envios");
		clientesTable.setWidget(0, 5, lblEnvio);
		
		Label lblRegistro = new Label("Registro");
		clientesTable.setWidget(0, 6, lblRegistro);
		
		Label lblOperacioes = new Label("Operaciones");
		clientesTable.setWidget(0, 7, lblOperacioes);
		
		//init
		refrescarTabla();
	}
	protected void buscarClientes() {
		IServiciosClienteAsync serviciosCliente = GWT.create(IServiciosCliente.class);
		serviciosCliente.buscarClientes(readClienteParaBuscar(), new AsyncCallback<List<ClienteDTO>>() {
			
			@Override
			public void onSuccess(List<ClienteDTO> result) {
				setTablaClientes(result);
			}
			
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
	}

	private ClienteBusqueda readClienteParaBuscar() {
		ClienteBusqueda busqueda = new ClienteBusqueda(
				txtBuscarNombre.getText(), txtBuscarApp1.getText(), txtBuscarApp2.getText(), 
				txtBuscarCodigo.getText()
		);
		return busqueda;
	}

	private void refrescarTabla(){
		IServiciosClienteAsync serviciosCliente = GWT.create(IServiciosCliente.class);
		serviciosCliente.listClientes(new AsyncCallback<List<ClienteDTO>>() {
			
			@Override
			public void onSuccess(List<ClienteDTO> result) {
				setTablaClientes(result);
			}
			
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
	}
	private void setTablaClientes(List<ClienteDTO> clientes){
		while(clientesTable.getRowCount() > 1) clientesTable.removeRow(1);
		for(final ClienteDTO cliente : clientes){
			
			int row = clientesTable.getRowCount();
			
			final int id = cliente.getId();
			clientesTable.setText(row, 0, "" + cliente.getId());
			clientesTable.setText(row, 1, cliente.getNombre());
			clientesTable.setText(row, 2, cliente.getApellido1());
			clientesTable.setText(row, 3, cliente.getApellido2());
			clientesTable.setText(row,  4,  cliente.getCorreo());
			clientesTable.setText(row, 5, "" +cliente.getEnvios());
			clientesTable.setText(row, 6, DateTimeFormat.getMediumDateFormat().format(cliente.getFechaRegistro()));
			HorizontalPanel hor = new HorizontalPanel();
			if (seleccion){
				rdbSeleccion = new RadioButton("ff");

				rdbSeleccion.addClickHandler(new ClickHandler() {
					public void onClick(ClickEvent event) {
						clienteSeleccionado=cliente;
						if (emisor) datosPaquete.setEmisor(cliente);
						else datosPaquete.setReceptor(cliente);
					}
				});
				hor.add(rdbSeleccion);
			}
			
			hor.add(new Button("Paquetes", new ClickHandler(){
				public void onClick(ClickEvent event) {
					PaquetesClienteDialog paquetesClienteDialog = new PaquetesClienteDialog(cliente);
					paquetesClienteDialog.setSize("580px", "400px");
					paquetesClienteDialog.center();
				}
			}));
			hor.add(new Button("Modificar", new ClickHandler(){
				public void onClick(ClickEvent event) {
					ClienteDialog clienteDialog = new ClienteDialog(cliente);
					clienteDialog.center();
					clienteDialog.addCloseHandler(new CloseHandler<PopupPanel>() {
						@Override
						public void onClose(CloseEvent<PopupPanel> event) {
							refrescarTabla();
						}
					});
				}
			}));
			hor.add(new Button("Eliminar", new ClickHandler(){
				public void onClick(ClickEvent event) {
					if(Alerts.confirmacionEliminacion()){
						IServiciosClienteAsync serviciosCliente = GWT.create(IServiciosCliente.class);
						serviciosCliente.eliminarCliente(id, new AsyncCallback<Boolean>() {
						
							@Override
							public void onSuccess(Boolean result) {
								Alerts.dialogExitoEliminacionDeObjeto("Cliente");
								refrescarTabla();
							}
						
							@Override
							public void onFailure(Throwable caught) {
								Alerts.dialogErrorConexion();
							}
						});
					}
				}
			}));

			clientesTable.setWidget(row, 7, hor);
		}
	}

	@Override
	public boolean isValid() {
		if (emisor && getIdAlmacen()>0) guardarAlmacen();
		if ( emisor && getIdAlmacen() < 1) return false;
		if (emisor && datosPaquete.getEmisor()==null) return false;
		datosPaquete.getReceptor();
		if (!emisor && datosPaquete.getReceptor()==null) return false;
		return true;
	}

	@Override
	public String getError() {
		if (emisor && getIdAlmacen()<1 ) return "Debe seleccionar un almacen origen";
		String msg="Debe seleccionar un cliente";
		if (emisor) msg+=" emisor";
		else msg+= " receptor";
		return msg;
	}

	public int getIdAlmacen(){
		return padrePaquete.getIdAlmacen();
	}
	
	@Override
	public Widget getWidget(){
		return this;
	}
	
	@Override
	public void clear() {
		refrescarTabla();
		return;
	}
	public ClienteDTO getSeleccion(){
		return clienteSeleccionado;
	}
	public void guardarAlmacen(){
		System.out.println("guardar almacen "+ padrePaquete.getIdAlmacen());
		IServiciosAlmacenAsync serviciosAlmacen = GWT.create(IServiciosAlmacen.class);
		serviciosAlmacen.getAlmacen(padrePaquete.getIdAlmacen(), new AsyncCallback<AlmacenDTO>() {
		
			@Override
			public void onSuccess(AlmacenDTO result) {
				datosPaquete.setOrigen(result);
			}
		
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
	}
	public AlmacenDTO getAlmacen(){
		/*
		guardarAlmacen();
		if (almacen==null)
			System.out.println("almacen nulo");
		System.out.println("padre id "+ padrePaquete.getIdAlmacen());
		return almacen;
		*/
		return null;
	}
	@Override
	public void actualizar() {
		refrescarTabla();
		return;
	}
}
